# build in python 3.5.2
# 作者：陈常鸿
# 梯度下降
# 函数1：待优化函数f(x),根据输入返回函数值
# 函数2：待优化函数的导数g(x),根据输入返回导数值
# 变量x:保存当前优化过程中的参数值，优化开始时变量初始化为一个随机值，优化过程不断变化直到找到最小值
# 变量grad:保存变量x点处的梯度值
# 变量step:表示艳梯度下降方向行进的步长，就是学习效率
import numpy as np
import matplotlib.pyplot as plt
def gradient_descent(x,step,g):
    for i in range(20):
        grad=g(x)
        x-=grad*step
        print('迭代数{0} grad = {1} ,x={2}'.format(i,grad,x))
        if abs(grad)<1e-6:
            break
    return x

def f(x):
    return x*x - 2*x + 1

def g(x):
    return 2*x-2

x=np.linspace(-5,7,100)
y=f(x)
plt.plot(x,y)

# 然后用梯度下降计算极值
gradient_descent(5,0.1,g)